﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace ShoppingOnline.App_Code
{
    public class SqlHelper
    {
        //从配置文件中获取数据库连接字符串
        private static readonly string connString = ConfigurationManager.ConnectionStrings["SqlOnlineShopMS"].ConnectionString;

        /// <summary>
        /// ExecNonQuery方法：执行增、删、改操作的方法。通过传入SQL语句和参数数组，使用SqlCommand对象执行命令，并返回受影响的行数。
        /// </summary>
        /// <param name="sql">增删改的SQL语句  必填</param>
        /// <param name="commandParams">参数数组  选填</param>
        /// <returns>受影响的行数</returns>
        public static int ExecNonQuery(string sql,
            params SqlParameter[] commandParams)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand cmd = new SqlCommand();
                PreparedCommand(sql, commandParams, conn, cmd);
                return cmd.ExecuteNonQuery();
            }
        }

        private static void PreparedCommand(string sql, SqlParameter[] commandParams, SqlConnection conn, SqlCommand cmd)
        {
            // 判断数据库连接对象若不是打开状态则打开
            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.CommandText = sql;// 设置执行的SQL语句
            cmd.Connection = conn;// 关联数据库连接对象

            if (commandParams != null)
                cmd.Parameters.AddRange(commandParams);
        }

        /// <summary>
        /// 执行查询操作，返回第一行第一列的数据。
        /// 通过传入SQL语句和参数数组，使用SqlCommand对象执行命令，并返回查询结果的第一行第一列的值。
        /// </summary>
        /// <param name="sql">查询的SQL语句  必填</param>
        /// <param name="commandParams">参数数组  选填</param>
        /// <returns>第一行第一列的数据</returns>
        public static object ExecScalar(string sql,
           params SqlParameter[] commandParams)
        {
            // 自动释放资源
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand cmd = new SqlCommand();
                PreparedCommand(sql, commandParams, conn, cmd);

                return cmd.ExecuteScalar();
            }
        }

        /// <summary>
        /// 执行查询操作，返回一个SqlDataReader对象。
        /// 通过传入SQL语句和参数数组，使用SqlCommand对象执行命令，并返回查询结果的数据读取器。
        /// </summary>
        /// <param name="sql">查询的SQL语句  必填</param>
        /// <param name="commandParams">参数数组  选填</param>
        /// <returns>SqlDataReader对象</returns>
        public static SqlDataReader ExecDataReader(string sql, params SqlParameter[] commandParams)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            PreparedCommand(sql, commandParams, conn, cmd);

            // CommandBehavior.CloseConnection: 若dataReader对象关闭则自动关闭connection对象
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }

        /// <summary>
        /// 执行查询操作，返回一个DataSet对象，该对象包含查询结果的所有数据。
        /// 通过传入SQL语句和参数数组，使用SqlCommand对象执行命令，并使用SqlDataAdapter适配器填充一个DataSet对象。
        /// </summary>
        /// <param name="sql">查询的SQL语句  必填</param>
        /// <param name="commandParams">参数数组  选填</param>
        /// <returns>DataSet对象</returns>
        public static DataSet ExecDataSet(string sql, params SqlParameter[] commandParams)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand cmd = new SqlCommand();
                PreparedCommand(sql, commandParams, conn, cmd);

                // 创建适配器对象
                using (SqlDataAdapter dap = new SqlDataAdapter())
                {
                    dap.SelectCommand = cmd;// 适配器对象关联command对象
                    DataSet ds = new DataSet();
                    dap.Fill(ds);
                    return ds;
                }
            }
        }
    }
}
